import cv2 as cv
import os
import datetime
import re

# 用 OpenCV 开发难免会针对 Camera 或者是 Video 做处理，有的时候需要将画面保留下来，这个时候最佳方案是保存成一个*.avi 的文件。
# OpenCV 用来创建视频文件的类是 VideoWriter。使用OPenCv+Python完成视频文件读取和保存（45分）
# （1）读取视频文件vipunmarkedroad.avi
cap = cv.VideoCapture('data/vipunmarkedroad.avi')

# （2）利用（*'XVID'）定义4 字符的编码器fourcc
fourcc = cv.VideoWriter_fourcc(*'XVID')

# （3）视频保存文件名output.avi，设置帧率20，视频尺度（640，480）
FPS = 20
file_name = os.path.basename(__file__)
save_dir = os.path.join('save', file_name)
os.makedirs(save_dir, exist_ok=True)
regexp = re.compile(r'[^a-zA-Z0-9\-_\.]')
save_path = os.path.join(save_dir, regexp.sub('', str(datetime.datetime.now())) + '.avi')

INTERVAL = 1000 // FPS
first = True
while True:
    # （4）读取视频帧，返回ret, frame
    ret, frame = cap.read()

    # （7）如果ret=Fase，中断退出循环
    if not ret:
        print('Cannot read video, existing...')
        break

    if first:
        first = False
        frame_shape = frame.shape
        h = frame_shape[0]
        w = frame_shape[1]
        print('shape', w, h)
        writer = cv.VideoWriter(save_path, fourcc, FPS, (w, h))  # ATTNETION doc is in VideoWriter.open; size is (w, h) not (h, w)
    writer.write(frame)

    # （5）将帧转变为灰度图
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    # （6）通过播放帧显示灰色视频
    cv.imshow('Video', gray)

    # （8）如果ret=True，按下“ESC”健，中断退出循环
    k = cv.waitKey(INTERVAL) & 0xFF
    if k == 27:
        break

cap.release()  # ATTENTION
writer.release()  # ATTENTION
cv.destroyAllWindows()
# （9）释放并关闭所有窗口
